home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / shell / tsbgex / src / win / map.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  2.3 KB  |  110 lines

  1. #include "win.h"
  2.  
  3. map(w)
  4. struct window *w;
  5. {
  6.     char work[MAXSIZE];
  7.     struct window *p;
  8.     int sx, sy, sx2, sy2, upper;;
  9.     extern struct list head;
  10.     extern void save(), memcpy(), show();
  11.  
  12.     w->x2 = w->x + w->w - 1;
  13.     w->y2 = w->y + w->h - 1;
  14.     if (w->mapped)
  15.         return (-1);
  16.     if (w->save != NULL){
  17.         save(work, w->x, w->y, w->x2, w->y2);
  18.         memcpy(w->save, work, w->size);
  19.     }
  20.     w->mapped = TRUE;
  21.     if (w->save != NULL)
  22.         show(work, w);
  23.  
  24.     upper = FALSE;
  25.     for (p = head.next; p->next != NULL; p = p->next){
  26.         if (p == w){
  27.             upper = TRUE;
  28.             continue;
  29.         }
  30.         if (!p->mapped)
  31.             continue;
  32.         sx = max(p->x, w->x);
  33.         sy = max(p->y, w->y);
  34.         sx2 = min(p->x2, w->x2);
  35.         sy2 = min(p->y2, w->y2);
  36.         if (sx <= sx2  &&  sy <= sy2){ /* intersection ? */
  37.             if (upper){
  38.                 if (w->notify != (void (*)())0
  39.                     &&  (w->notifyMask & HIDE_NOTIFY))
  40.                     (*w->notify)(p, HIDE_NOTIFY);    /* hide by p */
  41.             } else {
  42.                 if (p->notify != (void (*)())0
  43.                     &&  (p->notifyMask & HIDE_NOTIFY))
  44.                     (*p->notify)(w, HIDE_NOTIFY);    /* hide p */
  45.             }
  46.         }
  47.     }
  48.     return (0);
  49. }
  50.  
  51. unmap(w)
  52. struct window *w;
  53. {
  54.     char work[MAXSIZE];
  55.     struct window *p;
  56.     int sx, sy, sx2, sy2;
  57.     extern struct list head;
  58.     extern void expose();
  59.     
  60.     if (!w->mapped)
  61.         return (-1);
  62.     if (w->save != NULL)
  63.         expose(work, w, w->x, w->y, w->x2, w->y2);
  64.     w->mapped = FALSE;
  65.     for (p = head.next; p != w; p = p->next){
  66.         if (!p->mapped)
  67.             continue;
  68.         sx = max(p->x, w->x);
  69.         sy = max(p->y, w->y);
  70.         sx2 = min(p->x2, w->x2);
  71.         sy2 = min(p->y2, w->y2);
  72.         if (sx <= sx2  &&  sy <= sy2){
  73.             if (p->notify != (void (*)())0  
  74.                 &&  (p->notifyMask & EXPOSE_NOTIFY))
  75.                 (*p->notify)(w, EXPOSE_NOTIFY);
  76.         }
  77.     }
  78.     return (0);
  79. }
  80.  
  81. update(w)
  82. struct window *w;
  83. {
  84.     char work[MAXSIZE];
  85.     struct window *p;
  86.     int    x, y, x2, y2, sx, sy, sx2, sy2;
  87.     extern void memcpy(), show(), expose();
  88.     
  89.     if (!w->mapped)
  90.         return (0);
  91.  
  92.     if (w->save == NULL){
  93.         x = w->x; y = w->y; x2 = w->x2, y2 = w->y2;
  94.         for (p = w->next; p !=NULL; p=p->next){
  95.             if (!p->mapped  ||  p->save == NULL)
  96.                 continue;
  97.             sx = max(x, p->x);
  98.             sy = max(y, p->y);
  99.             sx2 = min(x2, p->x2);
  100.             sy2 = min(y2, p->y2);
  101.             if (sx <= sx2  &&  sy <= sy2)
  102.                 expose(work, p, sx, sy, sx2, sy2);
  103.         }
  104.     } else {
  105.         memcpy(work, w->save, w->size);
  106.         show(work, w);
  107.     }
  108.     return (0);
  109. }
  110.